<?php
// +----------------------------------------------------------------------------
// | Tke团队版权所属 [三十年河东三十年河西,莫欺少年穷.!]
// +----------------------------------------------------------------------------
// | Copyright (c) 2014 http://www.itdaodan.com All rights reserved.
// +----------------------------------------------------------------------------
// | Author: PHP@妖孽 <dino_ma@163.com>
// +----------------------------------------------------------------------------

namespace Admin\Model;
use Admin\Model\BaseModel;

/**
 * 用户模型
 */

class MemberModel extends BaseModel {

    protected $_validate = array(
       /* 验证用户名 */
		array('login_name', '4,30', '用户名长度不合法', self::EXISTS_VALIDATE, 'length',self::MODEL_BOTH), //用户名长度不合法
		array('login_name', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback',self::MODEL_BOTH), //用户名禁止注册
    	array('login_name', '/^[0-9a-zA-Z]{4,30}$/', '用户名不合法', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
		array('login_name','','帐号名称已经存在！',self::EXISTS_VALIDATE ,'unique',self::MODEL_BOTH), // 在新增的时候验证name字段是否唯一
		/* 验证密码 */
		array('login_pwd', '6,32', '密码长度在6-32位之间', self::VALUE_VALIDATE, 'length'), //密码长度不合法

    );
    
    /* 用户模型自动完成 */
    protected $_auto = array(
    		array('login_name', 'strtolower', self::MODEL_BOTH, 'function'),
    		array('login_pwd', 'checkLoginPwd', self::MODEL_BOTH, 'callback'),
    		array('reg_time', NOW_TIME, self::MODEL_INSERT),
    		array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
    		array('member_name', 'trim', self::MODEL_BOTH, 'function'),
    		array('update_time', NOW_TIME),
    		array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
    );
    
    
    /**
     * 新增或更新
     * @return boolean fasle 失败 ， 成功 返回完整的数据
     */
    public function update($data){
    	/* 获取数据对象 */
    	$data = empty($data) ? $_POST : $data;
    	$data = $this->create($data);
    	if(empty($data)){
    		return false;
    	}
    	if(empty($data[$this->getPk()])){ //新增数据
    		$id = $this->add();
    		$data[$this->getPk()] = $id;
    		if(!$id){
    			\Think\Log::write('新增用组:'.arr2str($data, ',').'失败');
    			$this->error = '新增用户出错！';
    			return false;
    		}
    		\Think\Log::write('新增用户:'.arr2str($data, ',').'成功');
    		action_log('member_add','member',$id ,UID);
    	} else {//更新数据
    		//返回需要改的数据
    		//     		$update_data = $this->checkBaseInfo($data,$_POST);
    		//     		if(array_key_exists('login_pwd', $update_data)){
    		//     			if($update_data['login_pwd'] == $this->checkLoginPwd(I('post.old_login_pwd'))){
    		//     				unset($update_data['login_pwd']);
    		//     			}
    		//     		}
    		//     		if(empty($update_data)){
    		//     			$this->error ='';
    		//     			return array($this->getPk()=>0);
    		//     		}
    		if(array_key_exists('login_pwd', $data)){
    			if($data['login_pwd']==''){
    				unset($data['login_pwd']);
    			}
    		}
    		if(array_key_exists('login_name', $data)){
    			if($data['login_name']==''){
    				unset($data['login_name']);
    			}
    		}
    		$data[$this->getPk()]=(int)I('post.'.$this->getPk());
    		$status = $this->save($data); //更新基础内容
    		if(false === $status){
    			$this->error = '更新用户出错！';
    			\Think\Log::write('更新用户:'.arr2str($data, ',').'失败');
    			return false;
    		}
    		\Think\Log::write('更新用户组:'.arr2str($data, ',').'成功');
    		action_log('member_edit','member',$data[$this->getPk()] ,UID);
    	}
    	return $data;
    }
    
    
    /**
     * @todo 返回主键
     * @see \Think\Model::getPk()
     */
    public function getPk(){
    	return 'uid';
    }
    
    public function lists($status = 1, $order = 'uid DESC', $field = true){
        $map = array('status' => $status);
        return $this->field($field)->where($map)->order($order)->select();
    }


    /**
     * 注销当前用户
     * @return void
     */
    public function logout(){
        session('user_auth', null);
        session('user_auth_sign', null);
    }

    /**
     * 自动登录用户
     * @param  integer $user 用户信息数组
     */
    private function autoLogin($user){
        /* 更新登录信息 */
        $data = array(
            'uid'             => $user[$this->getPk()],
            'login'           => array('exp', '`login`+1'),
            'last_login_time' => NOW_TIME,
            'last_login_ip'   => get_client_ip(1),
        );
        $this->save($data);

        /* 记录登录SESSION和COOKIES */
        $auth = array(
            'uid'             => $user[$this->getPk()],
            'username'        => $user['login_name'],
        	'member_name'        => $user['member_name'],
            'last_login_time' => $user['last_login_time'],
        );

        session('user_auth', $auth);
        session('user_auth_sign', data_auth_sign($auth));

    }
    
    /**
	 *@todo 获取用户登录名
	 */
    public function getLoginName($uid){
        return $this->where(array($this->getPk()=>(int)$uid))->getField('login_name');
    }
    
    /**
     * @todo 用户密码处理
     */
    protected function checkLoginPwd($login_pwd){
    	return tke_md5($login_pwd,C('DATA_AUTH_KEY'));
    }
    
    /**
     * 检测用户名是不是被禁止注册
     * @param  string $login_name 用户名
     * @return boolean          ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMember($login_name){
    	return true; //TODO: 暂不限制，下一个版本完善
    }
    
    /**
     * 检测邮箱是不是被禁止注册
     * @param  string $email 邮箱
     * @return boolean       ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyEmail($email){
    	return true; //TODO: 暂不限制，下一个版本完善
    }
    
    /**
     * 检测手机是不是被禁止注册
     * @param  string $mobile 手机
     * @return boolean        ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMobile($mobile){
    	return true; //TODO: 暂不限制，下一个版本完善
    }
    
    /**
     * 根据配置指定用户状态
     * @return integer 用户状态
     */
    protected function getStatus(){
    	return 1; //TODO: 暂不限制，下一个版本完善
    }
    
    /**
     * 注册一个新用户
     * @param  string $login_name 用户名
     * @param  string $login_pwd 用户密码
     * @param  string $email    用户邮箱
     * @param  string $mobile   用户手机号码
     * @return integer          注册成功-用户信息，注册失败-错误编号
     */
    public function register($login_name, $login_pwd){
    	$data = array(
    			'login_name' => $login_name,
    			'login_pwd' => $login_pwd,
    	);
    	/* 添加用户 */
    	if($this->create($data)){
    		$uid = $this->add();
    		\Think\Log::write('注册用户:'.$uid.'  用户名:'.$login_name.'  密码 : '.$login_pwd.'成功');
    		return $uid ? $uid : 0; //0-未知错误，大于0-注册成功
    	} else {
    		return $this->getError(); //错误详情见自动验证注释
    	}
    }
    
    /**
     * 用户登录认证
     * @param  string  $login_name 用户名
     * @param  string  $login_pwd 用户密码
     * @return integer           登录成功-用户ID，登录失败-错误编号
     */
    public function login($login_name, $login_pwd){
    	$map = array();
    	$map['login_name'] = strtolower($login_name);
    	$map['status'] = 1;
    	/* 获取用户数据 */
    	$user = $this->where($map)->find();
    	if(is_array($user) && $user['status']==1){
    		/* 验证用户密码 */
    		if(tke_md5($login_pwd,C('DATA_AUTH_KEY')) === $user['login_pwd']){
//     			$this->updateLogin($user['uid']); //更新用户登录信息
    			$this->autoLogin($user);//登录-+
    			//记录行为
				action_log('user_login', 'member', $user['uid'], $user['uid']);
    			return $user[$this->getPk()]; //登录成功，返回用户ID
    		} else {
    			return -2; //密码错误
    		}
    	} else {
    		return -1; //用户不存在或被禁用
    	}
    }
    
    /**
     * 获取用户信息
     * @param  string  $uid         用户ID或用户名
     * @param  boolean $is_login_name 是否使用用户名查询
     * @return array                用户信息
     */
    public function info($uid, $is_login_name = false){
    	$map = array();
    	if($is_login_name){ //通过用户名获取
    		$map['login_name'] = $is_login_name;
    	} else {
    		$map[$this->getPk()] = $uid;
    	}
    
    	$user = $this->where($map)->field('id,login_name,status')->find();
    	if(is_array($user) && $user['status'] = 1){
    		return array($user[$this->getPk()], $user['login_name']);
    	} else {
    		return -1; //用户不存在或被禁用
    	}
    }
    
    /**
     * 检测用户信息
     * @param  string  $field  用户名
     * @return integer         错误编号
     */
    public function checkField($field){
    	$data = array();
    	$data['login_name'] = $field;
    	return $this->create($data) ? 1 : $this->getError();
    }
    
    /**
     * 更新用户登录信息
     * @param  integer $uid 用户ID
     */
    protected function updateLogin($uid){
    	$data = array(
    			'last_login_time' => NOW_TIME,
    			'last_login_ip'   => get_client_ip(1),
    	);
    	if(false ===$this->where(array($this->getPk()=>$uid))->save($data))\Think\Log::write('更新用户:'.$uid.'失败');
    }
    
    /**
     * 更新用户信息
     * @param int $uid 用户id
     * @param string $login_pwd 密码，用来验证
     * @param array $data 修改的字段数组
     * @return true 修改成功，false 修改失败
     */
    public function updateUserFields($uid, $login_pwd, $data){
    	if(empty($uid) || empty($login_pwd) || empty($data)){
    		$this->error = '参数错误！';
    		return false;
    	}
    
    	//更新前检查用户密码
    	if(!$this->verifyUser($uid, $login_pwd)){
    		$this->error = '验证出错：密码不正确！';
    		return false;
    	}
    
    	//更新用户信息
    	$data = $this->create($data);
    	if($data){
    		\Think\Log::write('更新用户:'.$uid.'成功');
    		return $this->where(array('id'=>$uid))->save($data);
    	}
    	return false;
    }
    
    /**
     * 验证用户密码
     * @param int $uid 用户id
     * @param string $login_pwd_in 密码
     * @return true 验证成功，false 验证失败
     */
    protected function verifyUser($uid, $login_pwd_in){
    	$login_pwd = $this->getFieldById($uid, 'login_pwd');
    	if(tke_md5($login_pwd_in) === $login_pwd){
    		return true;
    	}
    	return false;
    }
}
